// #define PAIR(a, b) \
//   ((unsigned int)((((unsigned int)a) + ((unsigned int)b)) * (((unsigned int)a) + ((unsigned int)b) + ((unsigned int)1)) / ((unsigned int)2) + ((unsigned int)a)))
// #define PAIRp(a, b)                                                         \
//   ((uint64_t)(                                                              \
//       (((uint64_t)a) + ((uint64_t)b)) *                                     \
//           (((uint64_t)a) + ((uint64_t)b) + ((uint64_t)1)) / ((uint64_t)2) + \
//       ((uint64_t)1)))
// // #define PAIRp(a, b)                                                         \
// //   ((uint64_t)(                                                              \
// //       (((uint64_t)a) + ((uint64_t)b))))
// #define TRIPLE(a, b, c) ((unsigned int)(PAIR((unsigned int)c, PAIR(a, b))))
// #define TRIPLEp(a, b, c) ((unsigned int)(PAIRp((uint64_t)c, PAIRp(a, b))))
// #define PAIRpo(a, b)                                                        \
//   ((uint64_t)(                                                              \
//       (((uint64_t)a) + ((uint64_t)b)) *                                     \
//           (((uint64_t)a) + ((uint64_t)b) + ((uint64_t)1)) / ((uint64_t)2) + \
//       ((uint64_t)a)))
// #define TRIPLEpo(a, b, c) ((unsigned int)(PAIRpo((uint64_t)c, PAIRpo(a, b))))

// #define HASH2(a, b) \
//   ((unsigned int)(((reinterpret_cast<uint64_t>(a)) + (reinterpret_cast<uint64_t>(b))) * ((reinterpret_cast<uint64_t>(a)) + (reinterpret_cast<uint64_t>(b)) + 1) / 2 + reinterpret_cast<uint64_t>(a)))
#define HASH_O_2(a, b) (((uint32_t)a + (uint32_t)b) * ((uint32_t)a + (uint32_t)b + 1) / 2 + (uint32_t)a)
#define HASH_UO_2(a, b) (((uint32_t)a + (uint32_t)b) * ((uint32_t)a + (uint32_t)b + 1) / 2 + (uint32_t)1)
#define HASH_O_3(a, b, c) ((HASH_O_2(c, HASH_O_2(a, b))))
#define HASH_UO_3(a, b, c) ((HASH_UO_2(c, HASH_UO_2(a, b))))
#define HASH_UO_O_3(a, b, c) ((HASH_O_2(c, HASH_UO_2(a, b))))
